from django.shortcuts import render

# Create your views here.
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from orders.models import OrderInfo
from rest_framework.response import Response
from alipay import AliPay
from django.conf import settings
import os
from .models import Payment



class PaymentStatusView(APIView):
    """
    获取支付结果
    1,使用支付宝交易流水号绑定美多商城订单id
    2,还要修改订单的状态
    """
    def put(self, request):
        """
        读取查询字符串中支付宝重定向的参数
        out_trade_no=20180917012326000000001 (美多商城维护订单编号)
        sign：sign=q722wKrDJvRWrNNs5gwmLuKFW（验证本次通知、重定向是否来源自支付宝）
        trade_no：trade_no=2018091721001004510500275863（支付宝生成的交易流水号）
        """
        # data = ?charset=utf-8&out_trade_no=20180917012326000000001&method=alipay.trade.page.pay.return&total_amount=3798.00&sign=q722wKrDJvRWrNNs5gwmLuKFWNLhyfzqisWFAhQ4aqK6RuUpo73%2BZzSO5hwdglPlapGHYhR0ZpsB%2FlAH8SyAG6sU49VkvM3Juyhlr1d8eL62N5NCy6q1rCd2PN%2FRbK4xouzrbIxESBruFVBFabWaAcAH5iOB2yknvST9x5wWd09jIHtoIZ515nZC98ud0v298kYWe%2FY63iMVOkrVC55Lx0ebgU%2FsmnWv3DFIgeW6UiEno%2BwjeezYn6u8XCqJGrCkBXLBr9X3tk%2BN%2FwbgankTYJvLtwMkc4nZsWrPIt7eXI3wtq4u341gEkgaEoNDMgtC0CaTD9PDNVT89ASiayvFqw%3D%3D&trade_no=2018091721001004510500275863&auth_app_id=2016082100308405&version=1.0&app_id=2016082100308405&sign_type=RSA2&seller_id=2088102172481561&timestamp=2018-09-17+09%3A52%3A40
        # request.query_params ： 返回的是QueryDict类型的字典，只有get(),getlist()方法，没有pop()方法
        query_dict = request.query_params

        # 为了能够在后面调用pop()方法，需要将获取的QueryDict类型的字典，强转为标准字典
        data = query_dict.dict()
        # 从查询字符串中剔除掉'sign'，并接受sign的值，以备后用
        signature = data.pop("sign")


        # 创建SDK Alipay对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url

            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,

            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )

        # verify()方法使用data结合RSA2签名算法，生成一个新的signature，然后跟前面signature进行对比
        # 如果对比成功，就表示当前的重定向来自于支付宝；反之，就不是响应错误
        success = alipay.verify(data, signature)

        if success:
            # 认证成功
            # 读取数据
            order_id = data.get('out_trade_no')
            trade_id = data.get('trade_no')

            # 1 使用支付宝交易流水号绑定到美多商城订单id
            Payment.objects.create(
                order_id=order_id,
                trade_id=trade_id
            )
            # 2. 还要修改订单的状态
            # OrderInfo.objects.filter('订单状态是否是待支付').update('待发货')
            OrderInfo.objects.filter(order_id=order_id, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID']).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])

            return Response({'trade_id': trade_id})
        else:
            # 认证失败
            return Response({'message': '非法请求'}, status=status.HTTP_403_FORBIDDEN)







class PaymentView(APIView):
    """对接支付宝支付"""

    # 校验用户是否登录
    permission_classes = [IsAuthenticated]

    def get(self, request, order_id):
        """
        :param order_id:用户要支付的订单
        :return: alipay_url
        """
        # 获取当前登录用户
        user = request.user

        # 接受并校验order_id
        # 使用order_id查询出要支付的订单信息
        try:
            order = OrderInfo.objects.get(order_id=order_id, user=request.user, status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
        except OrderInfo.DoesNotExist:
            return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST)


        # 创建SDK Alipay对象
        alipay = AliPay(
            appid=settings.ALIPAY_APPID,
            app_notify_url=None,  # 默认回调url
            app_private_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                              "keys/app_private_key.pem"),
            alipay_public_key_path=os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                                "keys/alipay_public_key.pem"),  # 支付宝的公钥，验证支付宝回传消息使用，不是你自己的公钥,
            sign_type="RSA2",  # RSA 或者 RSA2
            debug=settings.ALIPAY_DEBUG  # 默认False
        )

        # 使用Alipay对象对接支付宝的支付接口，得到进入到支付宝扫码登录界面
        # 电脑网站支付，需要跳转到https://openapi.alipaydev.com/gateway.do? + order_string
        order_string = alipay.api_alipay_trade_page_pay(
            out_trade_no=order_id,
            total_amount=str(order.total_amount),
            subject="美多商城%s" % order_id,
            return_url="http://www.meiduo.site:8080/pay_success.html", # 支付结束后重定向支付结果的页面
        )

        # 响应用户alipay_url
        alipay_url = settings.ALIPAY_URL + '?' + order_string
        return Response({'alipay_url':alipay_url})


